#include "server.h"  // 必须包含服务端头文件，确保函数声明一致
#include "log.h"      // 日志输出（根据实际项目调整）
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
   

struct Server* init_server(int port) {
    // 1. 分配服务器结构体内存
struct Server* server;
    server = (struct Server*)malloc(sizeof(struct Server));
    if (server == NULL) {
        log_error("服务器内存分配失败: %s", strerror(errno));
        return NULL;
    }

    // 2. 创建服务器套接字
    server->server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server->server_fd < 0) {
        log_error("创建套接字失败: %s", strerror(errno));
        free(server);
        server = NULL;
        return NULL;
    }

    // 3. 设置端口复用
    int opt = 1;
    if (setsockopt(server->server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
        log_error("设置端口复用失败: %s", strerror(errno));
        close(server->server_fd);
        free(server);
        server = NULL;
        return NULL;
    }

 // 监听端口
    if (listen(server->server_fd, 10) < 0) {
        log_error("监听端口失败: %s", strerror(errno));
        close(server->server_fd);
        free(server);
        return NULL;
    }

    // 初始化客户端链表（假设使用dlist管理客户端）
    server->client_list = dlist_init();
    if (server->client_list == NULL) {
        log_error("客户端链表初始化失败");
        close(server->server_fd);
        free(server);
        return NULL;
    }

    log_info("服务端初始化成功，端口: %d", port);
    return server;
}

// 关键：实现 server_start 函数（服务端主循环）
void server_start(Server* server) {
    if (server == NULL) {
        log_error("server_start: 服务端实例为空");
        return;
    }

    log_info("服务端开始运行，等待客户端连接...");

    // 主循环：持续接受客户端连接
    while (1) {
        struct sockaddr_in client_addr;
        socklen_t client_addr_len = sizeof(client_addr);

        // 接受客户端连接
        int client_fd = accept(server->server_fd, (struct sockaddr*)&client_addr, &client_addr_len);
        if (client_fd < 0) {
            log_error("接受连接失败: %s", strerror(errno));
            continue;
        }

        log_info("新客户端连接: %s:%d (fd=%d)",
                 inet_ntoa(client_addr.sin_addr),
                 ntohs(client_addr.sin_port),
                 client_fd);

        // 将客户端FD加入链表管理
        dlist_append(server->client_list, (void*)(intptr_t)client_fd);
    }
}

// 关键：实现 server_destroy 函数（释放服务端资源）
void server_destroy(Server* server) {
    if (server == NULL) {
        log_warn("server_destroy: 服务端实例为空，无需释放");
        return;
    }

    // 1. 关闭监听socket
    if (server->server_fd >= 0) {
        close(server->server_fd);
        log_info("监听socket (fd=%d) 已关闭", server->server_fd);
    }

    // 2. 关闭所有客户端连接
    if (server->client_list != NULL) {
        dlist_traverse(server->client_list, (void(*)(void*))close);
        log_info("所有客户端连接已关闭");

        // 3. 销毁客户端链表
        dlist_destroy(server->client_list);
        server->client_list = NULL;
    }

    // 4. 释放服务端结构体内存
    free(server);
    log_info("服务端资源已完全释放");
}
